﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Utilites;
using Business;
using System.Configuration;
using DAOExceptions;
using NLog;

namespace FileSharingHosting
{
    public partial class CreateAccount : System.Web.UI.Page
    {
        private int DefaultLastQuota = 5120;
        static readonly Logger _log = LogManager.GetCurrentClassLogger();

        protected void send_btn_Click(object sender, EventArgs e)
        {
            _log.Debug("Validating user request...");
            Validate();
            if (IsValid)
            {
                _log.Debug("Valid!");
                RegControlsPanel.Enabled = false;
                UsersBusinessLogic ubll = new UsersBusinessLogic();
                Entities.User user = new Entities.User();
                Entities.Role user_role = new Entities.Role();
                try
                {
                    _log.Debug("Loading user-level role");
                    user_role = ubll.GetRolesList().Single((role) => (role.RoleLevel == Entities.UserPrivilegeLevels.User));
                }
                catch (DAOException)
                {
                    _log.Error("Failed to load user-level role");
                    ErrorDisplay();
                    return;
                }

                _log.Debug("Preparing data...");
                MD5String passwd = password.Text;
                user.Login = login.Text;
                user.Password = passwd;
                user.Email = email.Text;
                user.LastQuota = DefaultLastQuota;
                user.Roles.Add(user_role);

                string key = new MD5String(user.Login, user.Password, user.Email);
                string link = string.Format("http://fshare.ww-ish.net/Activate.aspx?key={0}", key);
                string host = "http://fshare.ww-ish.net/";
                string name = user.Login;

                user.AccountKey = key;

                try
                {
                    _log.Debug("Checking user existence");
                    if (ubll.UserExists(user.Login))
                    {
                        _log.Info(string.Format("Fail! User with that login is already exists (Login:{0})", user.Login));
                        AlrRegged();
                        return;
                    }
                    _log.Debug("Ok! Writing user data to db...");
                    ubll.AddUser(user);
                    _log.Debug("User added!");
                }
                catch (DAOException)
                {
                    _log.Error("Fail! Couldn't add user");
                    ErrorDisplay();
                    return;
                }

                _log.Debug("Sending mail...");
                System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage();
                message.To.Add(user.Email);
                message.Subject = "WW-ISH.NET File Sharing Account activation";
                message.From = new System.Net.Mail.MailAddress("noreply@ww-ish.net");
                message.Body = string.Format("Здравствуйте, {0}. <br/>Ваш электронный адрес был использован для регистрации на сайте {1}. " +
                "Если вы действительно это сделали и хотите активировать ваш аккаунт, перейдите по ссылке: <a href='{2}'>{2}</a>.<br/>" +
                "Если вы не регистрировались на нашем сайте, просто не отвечайте на это письмо.", name, host, link);

                System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient("ww-ish.net");
                smtp.Send(message);
                _log.Debug("Mail sent.");
                Okay.Visible = true;
            }
            else
            {
                _log.Debug("Data invalid");
            }
        }

        protected void ErrorDisplay()
        {
            RegisteringError.Visible = true;
        }

        protected void AlrRegged()
        {
            UserIsAlreadyRegistered.Visible = true;
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            _log.Debug("Create account page requested");
        }
    }
}